package com.cy.pj.notice.web.controller;

import com.cy.pj.common.util.PageUtil;
import com.cy.pj.notice.pojo.SysNotice;
import com.cy.pj.notice.service.SysNoticeService;
import com.cy.pj.notice.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 此对象为公告模块控制层处理器对象
 * 1、请求url方式设计
 * 1）条件查询 （请求方式-Get，请求url "/notice/"）
 * 2）新增公告 （请求方式-Post,请求url "/notice/"）
 * 3）基于id查询（请求方式-Get，请求url “/notice/{id}”）
 * 4) 更新公告（请求方式-put 请求 url “/notice/”）
 * 2、请求参数设计
 * 1）参数传递方式
 * 1.1）将请求参数通过url进行传递
 * 1.1.1）http://ip:port/?title=my&type=1    (application/test)
 * 1.1.2)http://ip:port/10
 * 1.2）请求参数通过请求提进行传递
 * 1.2.1){"title":"Study Spring Boot" ,"Content":"Study"...}  (application/json)
 * 1.3)服务端接受请求参数
 * 1.3.1)直接梁（8种基本数据类型，字符串，日期）
 * 1.3.2)pojo对象（但是需要提供和参数名对应的set方法）
 * 1.3.3）map对象（前提时必须使用@RequestParam或@RequestBody注解对参数进行描述）
 *
 * 1.4）方法参数描述
 * 1.4.1）@PathVariable  用于获取请求url种{}内部的变量值
 * 1.4.2）@RequestBody   用于获取请求体中json格式的数据
 * 1.4.3）@RequestParam  用于获取非json格式的请求参数数据,被标识的数据一定要传入如果不是会报400异常
 * 1.4.4）@DateTimeFormat用于设置可以接受的日期格式字符串
 *
 *
 * 3、响应标准设计（状态，消息，数据）：JsonResult
 * */
//@Controller
//@ResponseBody
@RestController
@RequestMapping("/notice/")
//@RequestMapping(Constans.NOTICE_ROOT)
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;
//    处理客户查询请求
//   不带参数的 http://localhost:80/notice/  或 http://localhost/notice/   80端口可以忽略
//    带参数的 http://localhost/notice?type=1&title=my
    @GetMapping
    public JsonResult doFindNotices(SysNotice notice ){


////       return new JsonResult(PageHelper.startPage(1, 3)
//                        .doSelectPageInfo(()->//lambda
////                                只有一句直接将大括号去除了
//                            sysNoticeService.findNotices(notice)
//        ));
    return  new JsonResult(
            PageUtil.startPage().doSelectPageInfo(()->sysNoticeService.findNotices(notice)));

        //        启动分页查询拦截 开始位置为1  查询条数为3条 拦截使用SELECT count(0) FROM sys_notice
//        PageInfo<SysNotice> pageInfo = PageHelper.startPage(1, 3)
////                java当中接口里面只有一个抽象方法时可以使用箭头符号
//                .doSelectPageInfo(()->{
//                    sysNoticeService.findNotices(notice);
//                });

//                执行查询
//                .doSelectPageInfo(new ISelect() {
//                    @Override
//                    public void doSelect() {
//                        sysNoticeService.findNotices(notice);
//                    }
//                });

//        return new JsonResult( pageInfo);
//        这个结果会返给谁？调用方（DIspatcherServlet）
//        方法调用方拿到方法执行结果以后会调用相关api将结果转换为json格式字符串
//        最后通过Response对象，将字符串响应到客户端
    }
    /**
     * 这是局部处理异常，不推荐使用，
     * 因为只能使用当前controller中的RuntimException异常
     */
//    @ExceptionHandler(RuntimeException.class)
//    public JsonResult doHandleRuntimeException(RuntimeException e){//这里可以填写Except
//        e.printStackTrace();//打印异常
//        log.error("exception msg is {}",e.getMessage());//把异常写到日志文件中
//        return  new JsonResult(e);
//    }
//    @GetMapping
//    public JsonResult doFindNotices(@RequestParam String title ,String modifiedUser,String type) {
////        return new JsonResult(sysNoticeService.findNotices(notice));
//    }
    /**
     * 新增公告信息，建议使用post
     * @param notice 封装客户端提交的通告信息，假如使用@RequestBody对参数进行描述，
     *               客户端可以向服务端传递json格式的字符串参数，服务端拿到字符串
     *              以后会将json字符串转为参数类型的对象(这个过程还可以理解为json反序列化)
     *  注意: 一个Controller方法中只能有一个参数使用RequestBody 注解进行描述
     * @return
     *
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice notice){

        sysNoticeService.saveNotice(notice);
        return new JsonResult("save Ok");
    }

    /**
     * rest风格的yrl中允许使用变量，但这个变量需要使用{}括起来
     * 当我们在方法参数中需要这个变量的值时，可以使用@PathVariable对
     * 方法参数进行描述
     * 访问url:http://localhost/notice/1
     * rest风格 "notice/{id}"
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable Long id){

            return new JsonResult(sysNoticeService.findById(id));

    }



    /**
     * 更新公告信息
     * @param notice 封装了公告信息的参数对象
     * @return
     */
    @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }
    @DeleteMapping("{ids}")
    public JsonResult doDeleteNotice(@PathVariable Long... ids){

          sysNoticeService.deleteById(ids);
          return new JsonResult("delete Ok");

      }
    }

